package ar.uade.edu.fain.ad.server.business;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import ar.uade.edu.fain.ad.common.transfer.SectorVO;

public class Sector {

	private Long id;
	private String nombre;
	private List<Empleado> mozos;
	private List<MesaSimple> mesasSimples;
	private List<MesaCompuesta> mesasCompuestas;
	private Salon salon;

	public Sector() {
		super();
		this.mozos = new ArrayList<Empleado>();
		this.mesasCompuestas = new ArrayList<MesaCompuesta>();
		this.mesasSimples = new ArrayList<MesaSimple>();
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public List<Empleado> getMozos() {
		return mozos;
	}

	public void setMozos(List<Empleado> mozos) {
		this.mozos = mozos;
	}

	public List<MesaCompuesta> getMesasCompuestas() {
		return mesasCompuestas;
	}

	public void setMesasCompuestas(List<MesaCompuesta> mesasCompuestas) {
		this.mesasCompuestas = mesasCompuestas;
	}

	public List<MesaSimple> getMesasSimples() {
		return mesasSimples;
	}

	public void setMesasSimples(List<MesaSimple> mesasSimples) {
		this.mesasSimples = mesasSimples;
	}

	public Salon getSalon() {
		return salon;
	}

	public void setSalon(Salon salon) {
		this.salon = salon;
	}

	public List<Mesa> ubicarMesasPara(Integer cantidadComensales) {
		if (cantidadComensales.compareTo(0) < 1) {
			throw new IllegalArgumentException(
					"Cantidad de comensales no valida.");
		}
		int cantidadDisponible = 0;
		final ArrayList<Mesa> disponibles = new ArrayList<Mesa>();
		for (Mesa mesa : getMesasSimples()) {
			if (mesa.getEstado().equalsIgnoreCase(Mesa.MESA_LIBRE)) {
				disponibles.add(mesa);
				cantidadDisponible += mesa.getCantidad();
			}
		}
		if (cantidadComensales > cantidadDisponible) {
			return Collections.emptyList();
		} else {
			return disponibles;
		}
	}
	
	public Mesa prepararMesa(final Set<MesaSimple> mesas) {
		if (mesas.isEmpty()) {
			throw new IllegalArgumentException(
					"Se necesitan mesas para armar una mesa.");
		}
		for (MesaSimple mesaSimple : mesas) {
			if (!mesaSimple.getSector().equals(this)) {
				throw new IllegalArgumentException(
						"Mesa " + mesaSimple.getId() + 
						" no pertenece al sector.");
			}
		}
		if (mesas.size() == 1) {
			MesaSimple mesaSimple = mesas.iterator().next();
			return mesaSimple;
		} else {
			MesaCompuesta mesaCompuesta = new MesaCompuesta();
			mesaCompuesta.setSector(this);
			for (MesaSimple simple : mesas) {
				mesaCompuesta.agregar(simple);
			}
			return mesaCompuesta;
		}
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Sector other = (Sector) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	public SectorVO toVO() {
		final SectorVO vo = new SectorVO();
		vo.setId(getId());
		vo.setNombre(getNombre());
		return vo;
	}
	
}
